#include <bits/stdc++.h>

using uint=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128;

const int N=1e6+5;

void Solve(){
    
    return;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); std::cout.tie(nullptr);
    std::string s;
    std::cin>>s;
    for(int i=0;i<s.size();i++){
        if(s[i]=='?'){
            int l=i-1;
            int r=i+1;
            int cb=0,ca=0;
            if(s[l]==s[r])s[i]=s[l];
            else{
                while(l>=0){
                    if(s[l]=s[i-1]){
                        cb++;
                        l--;
                    }
                    else{
                        break;
                    }
                }
                while(r>=0){
                    if(s[r]==s[i+1]){
                        ca++;
                        r++;
                    }
                    else{
                        break;
                    }
                }
                if(cb%2==1)s[i]=s[i-1];
                else if(ca%2==1)s[i]=s[i+1];
                else s[i]=s[i-1];
            }
        }
    }
    int ans=0;
    for(int i=1;i<s.size();i++){
        if(s[i]==s[i-1]){
            ans++;
            i++;
        }
    }
    std::cout<<ans<<std::endl;

    return 0;
}

// 题目：二进制填充
// 描述：
// 有一个长度为n的二进制串s，其中有一些位置标记为?。在这些位置上可以任意填充0或者1。请问，如何填充这位位置，
// 使得这个二进制串中出现互不重叠的00和11子串最多。请输出子串的个数。
// 输入格式
// 一行，一个包含?的二进制串。
// 输出格式
// 一个数，表示答案。
// 输入样例
// 1110?0
// 输出样例
// 2